package com.caocaog.market.util;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import org.jeecg.common.exception.JeecgBootException;

import java.util.HashMap;
import java.util.Map;

/**
 * 字节跳动小程序
 *
 * @author chechen
 * @date 2022-04-27
 */
public class BytedanceMicroApp {
    private BytedanceMicroApp() {
    }

    /**
     * 请求地址，通过login接口获取到登录凭证后，开发者可以通过服务器发送请求的方式获取 session_key 和 openId
     */
    private static final String URL = "https://developer.toutiao.com/api/apps/v2/jscode2session";

    /**
     * 请求参数
     */
    private static Map<String, Object> requestParameter = new HashMap<>();

    /**
     * 初始化请求参数
     * appid
     * secret
     * 这两个参数是抖音开发账户信息
     */
    private static void initializationRequestParameter() {
        requestParameter = new HashMap<>();
        requestParameter.put("appid", "tt2ace5c73b5f6f6db01");
        requestParameter.put("secret", "deac3e83c717084158d5a146487694e58da9b906");
    }

    static {
        initializationRequestParameter();
    }

    /**
     * 获取access_token
     */
    public static BytedanceMicroAppResult getOpenId(String code) {
        requestParameter.put("code", code);
        String resultString = HttpUtil.post(URL, requestParameter);
        if (resultString.contains("err_no")) {
            ErrCodeEnum errCodeEnum = ErrCodeEnum.match(JSON.parseObject(resultString).getInteger("err_no"));
            if (errCodeEnum.err_no != 0)
                throw new JeecgBootException(errCodeEnum.err_tips);
        }
        return JSON.parseObject(resultString, BytedanceMicroAppResult.class);
    }

    public static void main(String[] args) {
        getOpenId("1234");
    }

    @Data
    public static class BytedanceMicroAppResult {
        // 会话密钥，如果请求时有 code 参数才会返回
        private String session_key;
        // 用户在当前小程序的 ID，如果请求时有 code 参数才会返回
        private String openid;
        // 匿名用户在当前小程序的 ID，如果请求时有 anonymous_code 参数才会返回
        private String anonymous_openid;
        // 用户在小程序平台的唯一标识符，请求时有 code 参数才会返回。如果开发者拥有多个小程序，可通过 unionid 来区分用户的唯一性
        private String unionid;
        // 不知道是什么，发现返回的对象中有这个字段
        private String dopenid;
    }

    public enum ErrCodeEnum {

        REQUEST_SUCCEEDED(0, "请求成功"),
        SYSTEM_ERROR(1, "系统错误"),
        REQUIRED_PARAMETERS_NOT_PASSED(40014, "未传必要参数，请检查"),
        APPID_ERROR(40015, "appid 错误"),
        SECRET_ERROR(40017, "secret 错误"),
        CODE_ERROR(40018, "code 错误"),
        ACODE_ERROR(40019, "acode 错误"),
        PARAMETER_IS_EMPTY(-1, "参数为空");


        ErrCodeEnum(Integer err_no, String err_tips) {
            this.err_no = err_no;
            this.err_tips = err_tips;
        }

        public Integer err_no;
        public String err_tips;

        public static ErrCodeEnum match(Integer err_no) {
            if (err_no != null) {
                for (ErrCodeEnum item : ErrCodeEnum.values()) {
                    if (item.err_no.equals(err_no)) {
                        return item;
                    }
                }
            }
            return PARAMETER_IS_EMPTY;
        }

    }

}
